/*
____/\\\\\\\\\_____        __/\\\________/\\\_        __/\\\\\\\\\\\_
 __/\\\///////\\\___        _\/\\\_______\/\\\_        _\/////\\\///__
  _\/\\\_____\/\\\___        _\/\\\_______\/\\\_        _____\/\\\_____
   _\/\\\\\\\\\\\/____        _\/\\\_______\/\\\_        _____\/\\\_____
    _\/\\\//////\\\____        _\/\\\_______\/\\\_        _____\/\\\_____
     _\/\\\____\//\\\___        _\/\\\_______\/\\\_        _____\/\\\_____
      _\/\\\_____\//\\\__        _\//\\\______/\\\__        _____\/\\\_____
       _\/\\\______\//\\\_        __\///\\\\\\\\\/___        __/\\\\\\\\\\\_
        _\///________\///__        ____\/////////_____        _\///////////__
*/
#include "RUI_MATH.h"

/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //int16_t绝对值
 *	@parameter:		    //
 *	@time:				//23-04-20 03:38
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
int16_t RUI_F_MATH_ABS_int16_t(int16_t DATA)
{

    return DATA>>15 == 0 ? DATA : (~DATA + 1);
}
int32_t RUI_F_MATH_ABS_int32_t(int32_t DATA)
{
    if (DATA < 0) return -DATA;
    if (DATA > 0) return DATA;
	return 0;
}

/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //float绝对值
 *	@parameter:		    //
 *	@time:				//23-04-20 03:39
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
float RUI_F_MATH_ABS_float(float DATA)
{
    uint32_t RUI_V_TEMP = *(uint32_t*) &DATA;
    RUI_V_TEMP &= 0x7FFFFFFF; // 将符号位清零
    return *(float*) &RUI_V_TEMP;
}

/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //float 限幅
 *	@parameter:		    //
 *	@time:				//23-04-20 03:39
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
float RUI_F_MATH_Limit_float(float MAX , float MIN , float DATA)
{
    return (DATA > MAX) ? MAX : ((DATA < MIN) ? MIN : DATA);
}
/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //float 限幅
 *	@parameter:		    //
 *	@time:				//2023-05-23 17:41
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
int16_t RUI_F_MATH_Limit_int16(int16_t MAX , int16_t MIN , int16_t DATA)
{
    return (DATA > MAX) ? MAX : ((DATA < MIN) ? MIN : DATA);
}
/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //SETBIT
 *	@parameter:		    //@设置的字节的指针@要设置的位所在的位置（0到7），@要设置的值（1表示要将指定位设置为1，0表示要将其设置为0）
 *	@time:				//23-04-20 02:28
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
void RUI_F_MATH_SETBIT(unsigned char* byte , int position , int value)
{
    unsigned char mask = 1 << position;  // 生成一个只有指定位置为1的掩码
    if (value)
    {
        *byte |= mask;  // 将指定位置设置为1
    }
    else
    {
        *byte &= ~mask;  // 将指定位置设置为0
    }
}
/************************************************************万能分隔符**************************************************************
 * 	@author:			//小瑞
 *	@performance:	    //float平方根倒数
 *	@parameter:		    //
 *	@time:				//23-04-20 10:20
 *	@ReadMe:			//
 ************************************************************万能分隔符**************************************************************/
float RUI_F_MATH_INV_SQRT_float(float DATA)
{
    float DATA_half = 0.5f * DATA;
    uint32_t i = *(uint32_t*) &DATA; // 将浮点数视为无符号整数
    i = 0x5f3759df - (i >> 1); // 运用魔数进行处理
    DATA = *(float*) &i; // 再将无符号整数转回浮点数
    DATA = DATA * (1.5f - DATA_half * DATA * DATA); // 进行牛顿迭代
    return DATA;
}

float uint_to_float(int16_t x_int, float span, int16_t value)
{
	return x_int-value/2/value*span;
}

